package com.whfp.afs330h_sdk.utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 项目名：SQJD
 * 包  名：com.whfp.sqjd.utils
 * 作  者：Created by 张明杨 on 2019-06-10-0010.
 * 描  述：Json解析工具类，自动初始化null值为空字符串。 需要依赖google提供的工具库Gson才可使用
 */
public class RxGsonTool implements JsonSerializer<String>, JsonDeserializer<String> {


    private RxGsonTool() {
    }


    /**
     * 解析普通json
     *
     * @param json  要解析的json
     * @param clazz 对应的实体类
     * @param <T>   泛型
     * @return
     */
    public static <T> T parseJSON(String json, Class<T> clazz) {
        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(String.class, new RxGsonTool());
        Gson gson = gb.create();
        T info = gson.fromJson(json, clazz);
        return info;
    }

    /**
     * 解析泛型json
     *
     * @param json 要解析的json
     * @param type 要解析json的泛型类型
     * @param <T>  泛型
     * @return
     */
    public static <T> T parseJSON(String json, Type type) {
        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(String.class, new RxGsonTool());
        Gson gson = gb.create();
        T info = gson.fromJson(json, type);
        return info;
    }

    /**
     * 解析纯数组类型的json
     *
     * @param json  要解析的json
     * @param clazz 对应的实体类
     * @param <T>   泛型
     * @return
     */
    public static <T> List<T> jsonToList(String json, Class<? extends T[]> clazz) {
        Gson gson = new Gson();
        T[] array = gson.fromJson(json, clazz);
        return Arrays.asList(array);
    }

    /**
     * 解析对象型的数组的json
     *
     * @param json  要解析的json
     * @param clazz 对应的实体类
     * @param <T>   泛型
     * @return
     */
    public static <T> ArrayList<T> jsonToArrayList(String json, Class<T> clazz) {
        GsonBuilder gb = new GsonBuilder();
        gb.registerTypeAdapter(String.class, new RxGsonTool());
        Type type = new TypeToken<ArrayList<JsonObject>>() {
        }.getType();
        ArrayList<JsonObject> jsonObjects = gb.create().fromJson(json, type);
        ArrayList<T> arrayList = new ArrayList<>();
        for (JsonObject jsonObject : jsonObjects) {
            arrayList.add(new Gson().fromJson(jsonObject, clazz));
        }
        return arrayList;
    }

    @Override
    public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return json.getAsJsonPrimitive().getAsString();
    }

    @Override
    public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
        if (src == null) {
            return new JsonPrimitive("");
        } else {
            return new JsonPrimitive(src.toString());
        }
    }
}
